/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Administrador;
import br.com.sysdrive.model.Cargo;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rodrigo
 */
public class AdministradorDAOImpl implements GenericDAO {

    private Connection conn;

    public AdministradorDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    @Override
    public Boolean cadastrar(Object object) {
        PreparedStatement stmt = null;
        Administrador administrador = (Administrador) object;
        String sql = "insert into administrador (salario_administrador, data_admissao_administrador, data_demissao_administrador, id_cargo, id_usuario) values (?,?,?,?,?);";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDouble(1, administrador.getSalarioAdministrador());
            stmt.setDate(2, new java.sql.Date(administrador.getDataAdmissaoAdministrador().getTime()));
            stmt.setDate(3, new java.sql.Date(administrador.getDataDemissaoAdministrador().getTime()));
            stmt.setInt(4, administrador.getCargo().getIdCargo());

            UsuarioDAOImpl daoUsuario = new UsuarioDAOImpl();
            stmt.setInt(5, daoUsuario.cadastrar(administrador));
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Administrador! Erro SQL - AdministradorDAO: " + ex.getMessage());
            ex.printStackTrace();
            return false;
        } catch (Exception ex) {
            System.out.println("Problemas ao cadastrar Administrador! Erro AdministradorDAO: " + ex.getMessage());
            ex.printStackTrace();
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro:" + ex.getMessage());
            }
        }
    }

    @Override
    public List<Object> listar() {
        List<Object> resultado = new ArrayList<Object>();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select u.id_usuario, u.nome_usuario, u.data_nascimento_usuario, u.sexo_usuario, u.rg_ie_usuario, "
                + "u.cpf_cnpj_usuario, u.rua_endereco_usuario, u.numero_endereco_usuario, u.bairro_usuario, "
                + "u.complemento_usuario, u.cidade_usuario, u.cep_usuario, u.uf_usuario, u.email_usuario, "
                + "u.telefone_usuario, u.celular_usuario, u.data_cadastro_usuario, u.status_usuario, u.login_usuario, u.senha_usuario, "
                + "a.id_administrador, a.salario_administrador, a.data_admissao_administrador, a.data_demissao_administrador, a.id_cargo, c.descricao_cargo "
                + "from usuario u, administrador a, cargo c where u.id_usuario = a.id_usuario and a.id_cargo = c.id_cargo;";

        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Administrador administrador = new Administrador();
                administrador.setIdAdministrador(rs.getInt("id_administrador"));
                administrador.setSalarioAdministrador(rs.getDouble("salario_administrador"));
                administrador.setDataAdmissaoAdministrador(rs.getDate("data_admissao_administrador"));
                administrador.setDataDemissaoAdministrador(rs.getDate("data_demissao_administrador"));

                administrador.setIdUsuario(rs.getInt("id_usuario"));
                administrador.setNomeUsuario(rs.getString("nome_usuario"));
                administrador.setDataNascimentoUsuario(rs.getDate("data_nascimento_usuario"));
                administrador.setSexoUsuario(rs.getString("sexo_usuario"));
                administrador.setRgIeUsuario(rs.getString("rg_ie_usuario"));
                administrador.setCpfCnpjUsuario(rs.getString("cpf_cnpj_usuario"));
                administrador.setRuaEnderecoUsuario(rs.getString("rua_endereco_usuario"));
                administrador.setNumeroEnderecoUsuario(rs.getInt("numero_endereco_usuario"));
                administrador.setBairroUsuario(rs.getString("bairro_usuario"));
                administrador.setComplementoUsuario(rs.getString("complemento_usuario"));
                administrador.setCidadeUsuario(rs.getString("cidade_usuario"));
                administrador.setCepUsuario(rs.getString("cep_usuario"));
                administrador.setUfUsuario(rs.getString("uf_usuario"));
                administrador.setEmailUsuario(rs.getString("email_usuario"));
                administrador.setTelefoneUsuario(rs.getString("telefone_usuario"));
                administrador.setCelularUsuario(rs.getString("celular_usuario"));
                administrador.setDataCadastroUsuario(rs.getDate("data_cadastro_usuario"));
                administrador.setStatusUsuario(rs.getString("status_usuario"));
                administrador.setLoginUsuario(rs.getString("login_usuario"));
                administrador.setSenhaUsuario(rs.getString("senha_usuario"));

                Cargo cargo = new Cargo();
                cargo.setIdCargo(rs.getInt("id_cargo"));
                cargo.setDescricaoCargo(rs.getString("descricao_cargo"));

                administrador.setCargo(cargo);
                resultado.add(administrador);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao listar Administrador! Erro AdministradorDAO: " + ex.getMessage());
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao Fechar os parametros ao Listar Administrador! Erro AdministradorDAO: " + ex.getMessage());
            }
            return resultado;
        }
    }

    @Override
    public Object carregar(int idObject) {
        PreparedStatement stmt = null;
        Administrador administrador = null;
        ResultSet rs = null;
        String sql = "select u.id_usuario, u.nome_usuario, u.data_nascimento_usuario, u.sexo_usuario, u.rg_ie_usuario, "
                + "u.cpf_cnpj_usuario, u.rua_endereco_usuario, u.numero_endereco_usuario, u.bairro_usuario, "
                + "u.complemento_usuario, u.cidade_usuario, u.cep_usuario, u.uf_usuario, u.email_usuario, "
                + "u.telefone_usuario, u.celular_usuario, u.data_cadastro_usuario, u.status_usuario, "
                + "u.login_usuario, u.senha_usuario, a.id_administrador, a.salario_administrador, "
                + "a.data_admissao_administrador, a.data_demissao_administrador, a.id_cargo "
                + "from usuario u, administrador a where a.id_usuario = ? and u.id_usuario = a.id_usuario;";

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();
            while (rs.next()) {
                administrador = new Administrador();
                administrador.setIdUsuario(rs.getInt("id_usuario"));
                administrador.setNomeUsuario(rs.getString("nome_usuario"));
                administrador.setDataNascimentoUsuario(rs.getDate("data_nascimento_usuario"));
                administrador.setSexoUsuario(rs.getString("sexo_usuario"));
                administrador.setRgIeUsuario(rs.getString("rg_ie_usuario"));
                administrador.setCpfCnpjUsuario(rs.getString("cpf_cnpj_usuario"));
                administrador.setRuaEnderecoUsuario(rs.getString("rua_endereco_usuario"));
                administrador.setNumeroEnderecoUsuario(rs.getInt("numero_endereco_usuario"));
                administrador.setBairroUsuario(rs.getString("bairro_usuario"));
                administrador.setComplementoUsuario(rs.getString("complemento_usuario"));
                administrador.setCidadeUsuario(rs.getString("cidade_usuario"));
                administrador.setCepUsuario(rs.getString("cep_usuario"));
                administrador.setUfUsuario(rs.getString("uf_usuario"));
                administrador.setEmailUsuario(rs.getString("email_usuario"));
                administrador.setTelefoneUsuario(rs.getString("telefone_usuario"));
                administrador.setCelularUsuario(rs.getString("celular_usuario"));
                administrador.setDataCadastroUsuario(rs.getDate("data_cadastro_usuario"));
                administrador.setStatusUsuario(rs.getString("status_usuario"));
                administrador.setLoginUsuario(rs.getString("login_usuario"));
                administrador.setSenhaUsuario(rs.getString("senha_usuario"));
                administrador.setIdAdministrador(rs.getInt("id_administrador"));

                administrador.setDataAdmissaoAdministrador(rs.getDate("data_admissao_administrador"));
                administrador.setDataDemissaoAdministrador(rs.getDate("data_demissao_administrador"));
                administrador.setSalarioAdministrador(rs.getDouble("salario_administrador"));

                Cargo cargo = new Cargo();
                cargo.setIdCargo(rs.getInt("id_cargo"));

                administrador.setCargo(cargo);
            }
            return administrador;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao Carregar Administrador Usuario! Erro AdministradorDAO: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão Carregar Administrador! Erro AdministradorDAO: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }

    @Override
    public Boolean alterar(Object object) {
        PreparedStatement stmt = null;
        Administrador administrador = (Administrador) object;
        String sql = "update administrador set salario_administrador = ?, data_admissao_administrador = ?, data_demissao_administrador = ?, id_cargo = ? where id_usuario = ?;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDouble(1, administrador.getSalarioAdministrador());
            stmt.setDate(2, new java.sql.Date(administrador.getDataAdmissaoAdministrador().getTime()));
            stmt.setDate(3, new java.sql.Date(administrador.getDataDemissaoAdministrador().getTime()));
            stmt.setInt(4, administrador.getCargo().getIdCargo());
            stmt.setInt(5, administrador.getIdUsuario());
            stmt.executeUpdate();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao alterar Usuário Administrador! Erro AdministradorDAO: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão Alterar Administrador! Erro AdministradorDAO: " + ex.getMessage());
            }
        }
    }
}
